package model

import (
	"time"

	"github.com/bwmarrin/snowflake"
	"good.house/internal/constan"
	"good.house/internal/utils"
	"gorm.io/gorm"
)

type User struct {
	BaseModel
	Username    string `gorm:"size:32;not null;uniqueIndex"`
	Nickname    string `gorm:"size:32;not null"`
	Mobile      string `gorm:"size:11;not null;unique"`
	Password    string `gorm:"size:100;not null"`
	IsActive    bool   `gorm:"default:false"`
	LastLoginAt *time.Time
	Salt        string             // 盐值
	UserType    constan.UserType   `gorm:"not null"`
	Status      constan.UserStatus `gorm:"not null"`
}

func (u *User) TableName() string {
	return "users"
}

// 创建前钩子
func (u *User) BeforeCreate(db *gorm.DB) error {
	// 对密码进行hash
	if u.Password != "" {
		salt, err := utils.GenerateSalt(16)

		if err != nil {
			return err
		}
		u.Password = utils.HashPassowrd(u.Password, salt)
		u.Salt = salt
	}
	// 生成雪花ID
	node, _ := snowflake.NewNode(1)
	u.ID = node.Generate().Int64()

	// 默认启用用户
	u.Status = constan.Enable
	return nil
}

// 创建后钩子
func (u *User) AfterCreate(db *gorm.DB) error {
	return nil
}

// 更新前钩子
func (u *User) BeforeUpdate(db *gorm.DB) error {
	// 更新前检查密码是否被修改，如果被修改，则重新加密
	if db.Statement.Changed("Password") {
		salt, err := utils.GenerateSalt(16)

		if err != nil {
			return err
		}
		u.Password = utils.HashPassowrd(u.Password, salt)
		u.Salt = salt
	}

	u.Status = constan.Enable
	return nil
}

// 更新后钩子
func (u *User) AfterUpdate(db *gorm.DB) error {
	return nil
}

// 删除前钩子
func (u *User) BeforeDelete(db *gorm.DB) error {
	return nil
}

// 删除后钩子
func (u *User) AfterDelete(db *gorm.DB) error {
	return nil
}

// 查询后钩子
func (u *User) AfterFind(db *gorm.DB) error {
	return nil
}
